dependency inversion principle in java